home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 2
/
Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso
/
Pearls
/
comm
/
Envoy
/
Talk
/
tk_svc.asm
< prev
next >
Wrap
Assembly Source File
|
1994-04-17
|
9KB
|
342 lines
;---------------------------------------------------------------------------
;Talk Service written by Jeffrey A. Litz
;
;litz@cs.uwp.edu -or- Jeff_Litz@EDTNG.Kenosha.WI.US
;
;Copyright ©1994 JL Productions.
;---------------------------------------------------------------------------
OPTIMON
;---------------------------------------------------------------------------
NOLIST
INCDIR "include:"
INCLUDE "exec/types.i"
INCLUDE "exec/libraries.i"
INCLUDE "exec/lists.i"
INCLUDE "exec/alerts.i"
INCLUDE "exec/initializers.i"
INCLUDE "exec/resident.i"
INCLUDE "libraries/dos.i"
INCLUDE "tk_rev.i"
INCLUDE "tkbase.i"
LIST
;---------------------------------------------------------------------------
XREF _StartService
XREF _Server
XREF _GetServiceAttrsA
XREF ENDCODE
;---------------------------------------------------------------------------
XDEF LibInit
XDEF LibOpen
XDEF LibClose
XDEF LibExpunge
XDEF LibReserved
XDEF _TALKPassword
XDEF _TALKSignalMask
XDEF _TALKUser
XDEF _TALKEntityName
XDEF _TALKSMProc
XDEF _TALKServer
XDEF _TALKError
XDEF __sprintf
XDEF _SysBase
;---------------------------------------------------------------------------
; First executable location, must return an error to the caller
Start:
moveq #-1,d0
rts
;-----------------------------------------------------------------------
ROMTAG:
DC.W RTC_MATCHWORD ; UWORD RT_MATCHWORD
DC.L ROMTAG ; APTR RT_MATCHTAG
DC.L ENDCODE ; APTR RT_ENDSKIP
DC.B RTF_AUTOINIT ; UBYTE RT_FLAGS
DC.B VERSION ; UBYTE RT_VERSION
DC.B NT_LIBRARY ; UBYTE RT_TYPE
DC.B 0 ; BYTE RT_PRI
DC.L LibName ; APTR RT_NAME
DC.L LibId ; APTR RT_IDSTRING
DC.L LibInitTable ; APTR RT_INIT
LibName DC.B 'talk.service',0
LibId VERSTAG
CNOP 0,4
LibInitTable:
DC.L TALKSvc_SIZEOF
DC.L LibFuncTable
DC.L LibDataTable
DC.L LibInit
V_DEF MACRO
DC.L \1
ENDM
LibFuncTable:
V_DEF LibOpen
V_DEF LibClose
V_DEF LibExpunge
V_DEF LibReserved
V_DEF _RexxReserved
V_DEF _StartService
V_DEF _GetServiceAttrsA
DC.L -1
LibDataTable:
INITBYTE LN_TYPE,NT_LIBRARY
INITLONG LN_NAME,LibName
INITBYTE LIB_FLAGS,(LIBF_SUMUSED!LIBF_CHANGED)
INITWORD LIB_VERSION,VERSION
INITWORD LIB_REVISION,REVISION
INITLONG LIB_IDSTRING,LibId
DC.W 0
CNOP 0,4
;-----------------------------------------------------------------------
; Library Init entry point called when library is first loaded in memory
; On entry, D0 points to library base, A0 has lib seglist, A6 has SysBase
; Returns 0 for failure or the library base for success.
LibInit:
movem.l a0/a5/a6/d7,-(sp)
move.l d0,a5
move.l d0,_TALKBase
move.l a6,TALK_SysBase(a5)
move.l a6,_SysBase(pc)
move.l a0,TALK_SegList(a5)
move.l #AO_DOSLib,d7
lea DOSName(pc),a1
bsr.s OpenLib
move.l d0,TALK_DOSBase(a5)
move.l #AO_UtilityLib,d7
lea UtilityName(pc),a1
bsr.s OpenLib
move.l d0,TALK_UtilityBase(a5)
lea TALK_OpenLock(a5),a0
CALL InitSemaphore
clr.l TALK_Entity(a5)
clr.l TALK_NIPCBase(a5)
move.l a5,d0
movem.l (sp)+,a0/a5/a6/d7
rts
OpenLib:
moveq #LIBVERSION,d0
CALL OpenLibrary
move.l (sp)+,a0 ; pop return address
tst.l d0 ; did lib open?
beq.s FailInit ; nope, so exit
jmp (a0) ; yes, so return
FailInit:
bsr CloseLibs
or.l #AG_OpenLib,d7
CALL Alert
movem.l (sp)+,a0/a5/a6/d7
moveq #0,d0
rts
LIBVERSION EQU 37
DOSName DC.B "dos.library",0
UtilityName DC.B "utility.library",0
NIPCName DC.B "nipc.library",0
CNOP 0,4
;-----------------------------------------------------------------------
; Library open entry point called every OpenLibrary()
; On entry, A6 has ServicesBase, task switching is disabled
; Returns 0 for failure, or ServicesBase for success.
LibOpen:
; see if nipc.library is already open
tst.l TALK_NIPCBase(a6)
bne.s 2$
; lock anyone else out for a while, since we need to Wait()
lea.l TALK_OpenLock(a6),a0
move.l a6,-(sp)
move.l TALK_SysBase(a6),a6
CALL ObtainSemaphore
; open nipc.library
lea.l NIPCName,a1
clr.l d0
CALL OpenLibrary
move.l (sp),a6
move.l d0,TALK_NIPCBase(a6)
; unlock the rest of the word.
lea.l TALK_OpenLock(a6),a0
move.l TALK_SysBase(a6),a6
CALL ReleaseSemaphore
move.l (sp)+,a6
; did nipc open?
tst.l TALK_NIPCBase(a6)
bne.s 2$
clr.l d0 ; too bad...
rts
; open okay...
2$ addq.w #1,LIB_OPENCNT(a6)
bclr #LIBB_DELEXP,LIB_FLAGS(a6)
move.l a6,d0
rts
;-----------------------------------------------------------------------
; Library close entry point called every CloseLibrary()
; On entry, A6 has ServicesBase, task switching is disabled
; Returns 0 normally, or the library seglist when lib should be expunged
; due to delayed expunge bit being set
LibClose:
subq.w #1,LIB_OPENCNT(a6)
; if delayed expunge bit set, then try to get rid of the library
btst #LIBB_DELEXP,LIB_FLAGS(a6)
bne.s CloseExpunge
; delayed expunge not set, so stick around
moveq #0,d0
rts
CloseExpunge:
; if no library users, then just remove the library
tst.w LIB_OPENCNT(a6)
beq.s DoExpunge
; still some library users, so just flush unused resources
bclr #LIBB_DELEXP,LIB_FLAGS(a6)
moveq #0,d0
rts
;-----------------------------------------------------------------------
; Library expunge entry point called whenever system memory is lacking
; On entry, A6 has ServicesBase, task switching is disabled
; Returns the library seglist if the library open count is 0, returns 0
; otherwise and sets the delayed expunge bit.
LibExpunge:
tst.w LIB_OPENCNT(a6)
beq.s DoExpunge
bset #LIBB_DELEXP,LIB_FLAGS(a6)
moveq #0,d0
rts
DoExpunge:
movem.l d2/a5/a6,-(sp)
move.l a6,a5
move.l TALK_SegList(a5),d2
move.l a5,a1
REMOVE
move.l TALK_SysBase(a5),a6
bsr.s CloseLibs
move.l a5,a1
moveq #0,d0
move.w LIB_NEGSIZE(a5),d0
sub.l d0,a1
add.w LIB_POSSIZE(a5),d0
CALL FreeMem
move.l d2,d0
movem.l (sp)+,d2/a5/a6
rts
;-----------------------------------------------------------------------
LibReserved:
moveq #0,d0
rts
CloseLibs:
move.l TALK_DOSBase(a5),a1
CALL CloseLibrary
move.l TALK_NIPCBase(a5),a1
CALL CloseLibrary
move.l TALK_UtilityBase(a5),a1
GO CloseLibrary
;-----------------------------------------------------------------------
; TALKServer Entry Point
_TALKServer:
movea.l _TALKBase(pc),a6
movea.l _TALKUser(pc),a0
movea.l _TALKPassword(pc),a1
movea.l _TALKEntityName(pc),a2
jmp _Server
_TALKBase DC.L 0
_TALKUser DC.L 0
_TALKPassword DC.L 0
_TALKEntityName DC.L 0
_TALKSignalMask DC.L 0
_TALKSMProc DC.L 0
_TALKError DC.L 0
_SysBase DC.L 0 ; KLUDGE! HACK! HACK! HACK! for amiga.lib linking
;-----------------------------------------------------------------------
; Reserved Function for ARexx.
_RexxReserved:
moveq.l #0,d0
rts
;-----------------------------------------------------------------------
__sprintf:
movem.l a2/a3/a4/a6,-(sp)
move.l 5*4(sp),a3
move.l 6*4(sp),a0
lea 7*4(sp),a1
lea stuffChar(pc),a2
move.l TALK_SysBase(a6),a6
CALL RawDoFmt
movem.l (sp)+,a2/a3/a4/a6
rts
stuffChar:
move.b d0,(a3)+
rts
;-----------------------------------------------------------------------
END